package homework.day06;

/**
 * @description: 构造方法和this关键字练习题
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 定义类Teacher的练习题
 * 回答下列问题：
 * 1.在上面5个构造方法的基础上
 *      再定义一个构造方法单独给gender赋值，能够做到吗？为什么？
 *      这是做不到的，一个类中的多个构造器能够同时存在，符合Java方法的重载语法
 *      而形参的名字不同是不能构造方法重载的。
 * 2.定义完上述结构后，再定义一个成员方法setGender，用于给gender赋值。
 *      要求方法的形参就是String gender，这个方法如何写呢？
 *      使用this区分同名的局部变量和成员变量即可，详细见具体代码。
 *
 * 定义完这个类后，创建两个Teacher对象分别为t1和t2
 * 1. 要求t1对象的四个成员变量name, age, gender, teacherId的值分别为"张三"、18、"男"、 1
 * 2. 要求t2对象的四个成员变量name, age, gender, teacherId的值分别为"李四"、25、"女"、 2
 * 最后分别用两个对象调用print方法，两次调用方法输出的结果相同吗？为什么？
 * 肯定是不同的，不同对象调用成员方法，访问的都是自身的成员变量。
 *
 */
public class TeacherClazzDemo {
    public static void main(String[] args) {
        Teacher t1 = new Teacher("张三", 18, "男", 1);
        Teacher t2 = new Teacher("李四", 25, "女", 2);
        t1.print();
        t2.print();
    }
}

/*
    定义类时，需要定义成员变量，成员方法，构造方法等结构
    虽然这些结构的具体定义顺序，对代码的执行没有影响
    但普遍来说推荐大家按照下列顺序定义，这样代码的可读性更好：
         1.首先定义成员变量
         2.再定义构造器（如果有多个组成方法重载，就放在一起，并按照参数从少到多排列）
         3.最后定义成员方法（同样，如果有方法重载就放在一起，并按照参数从少到多排列）
 */
class Teacher {
    // 成员变量
    String name;
    int age;
    String gender;
    int teacherId;

    // 默认无参构造
    public Teacher() {
    }

    public Teacher(String name) {
        this.name = name;
    }

    public Teacher(String name, int teacherId) {
        this.name = name;
        this.teacherId = teacherId;
    }

    public Teacher(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public Teacher(String name, int age, String gender, int teacherId) {
        this(name, age, gender);
        this.teacherId = teacherId;
    }

    public void print() {
        System.out.println("这个老师的姓名为:" + this.name + "，年龄是" + this.age + "，职工号为" + this.teacherId + "，性别是" + this.gender);
    }

    // 成员方法给gender赋值
    public void setGender(String gender) {
        this.gender = gender;
    }
}